﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SimpleModeler.Graphics;

namespace SimpleModeler
{
    /// <summary>
    /// Modeler-Schnittstelle
    /// </summary>
    public interface IModeler
    {
        #region Indexer
        /// <summary>
        /// Liefert das Objekt mit der angegebenen ID. Sollte kein Objekt mit der ID existieren, so wird null returned
        /// </summary>
        /// <param name="id">ID des Objektes</param>
        /// <returns>Objekt mit der angegebenen ID. Sollte das Objekt nicht existieren, so wird null returned</returns>
        SceneObject this[ID id] { get; }

        /// <summary>
        /// Liefert das Objekt mit der angegebenen ID. Sollte kein Objekt mit der ID existieren, so wird null returned
        /// </summary>
        /// <param name="id">ID des Objektes</param>
        /// <returns>Objekt mit der angegebenen ID. Sollte das Objekt nicht existieren, so wird null returned</returns>
        SceneObject this[int id] { get; }
        #endregion // Indexer


        #region Properties
        /// <summary>
        /// Liste aller Objekte in der Szene
        /// </summary>
        Dictionary<ID, SceneObject> SceneObjects { get; }
        
        /// <summary>
        /// Das selektierte Objekt
        /// </summary>
        SceneObject SelectedObject { get; }
        #endregion // Properties


        #region Methods
        /// <summary>
        /// Selektiert das Objekt mit der angegebenen ID
        /// </summary>
        /// <param name="id">ID des zu selektierenden Objektes</param>
        void Select(ID id);
        
        /// <summary>
        /// Hebt die Selektierung wieder auf
        /// </summary>
        void Unselect();

        /// <summary>
        /// Löscht das Objekt mit der angegebenen ID
        /// </summary>
        /// <param name="id">ID des zu löschenden Objektes</param>
        void Delete(ID id);

        /// <summary>
        /// Fügt ein neues Objekt der Auflistung hinzu
        /// </summary>
        /// <param name="so">Das hinzuzufügende Objekt</param>
        void Add(SceneObject so);

        /// <summary>
        /// Überschreibt das angegebene Objekt
        /// </summary>
        /// <param name="so">Das Objekt, mit welchem das bereits existierende überschrieben werden soll</param>
        void Edit(SceneObject so);
        #endregion // Methods
    }
}
